{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###第三周作业\n",
    "在 Rental Listing Inquiries 数据上练习 xgboost 参数调优\n",
    "数据说明：\n",
    "Rental Listing Inquiries 数据集是 Kaggle 平台上的一个分类竞赛任务，需要根据\n",
    "公寓的特征来预测其受欢迎程度（用户感兴趣程度分为高、中、低三类）。其\n",
    "中房屋的特征 x 共有 14 维，响应值 y 为用户对该公寓的感兴趣程度。评价标准\n",
    "为 logloss。\n",
    "数据链接：https://www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries\n",
    "为减轻大家对特征工程的入手难度，以及统一标准，数据请用课程网站提供的\n",
    "特征工程编码后的数据（RentListingInquries_FE_train.csv）或稀疏编码的形式\n",
    "（RentListingInquries_FE_train.bin）。xgboost 既可以单独调用，也可以在\n",
    "sklearn 框架下调用。大家可以随意选择。若采用 xgboost 单独调用使用方式，\n",
    "建议读取稀疏格式文件。\n",
    "关于特征工程的过程，可参看文件：FE_RentListingInqueries.ipynb\n",
    "作业要求：\n",
    "采用 xgboost 模型完成商品分类（需进行参数调优）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier # scikit-learn嵌入的\n",
    "import xgboost as xgb             #用xgboost，交叉验证做迭代次数\n",
    "\n",
    "import numpy  as np #线性代数等\n",
    "import pandas as pd #读取文件等\n",
    "import scipy  as sp #处理10^10级别的数等\n",
    "import seaborn           as sns       #画图      \n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from matplotlib import pyplot\n",
    "from sklearn.model_selection import GridSearchCV  #网格搜索加交叉验证\n",
    "from sklearn.model_selection import StratifiedKFold #缺省的交叉验证用\n",
    "\n",
    "from sklearn.metrics import log_loss #评价指标"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取数据\n",
    "trainRental = pd.read_csv(\"RentListingInquries_FE_train.csv\")\n",
    "testRental  = pd.read_csv(\"RentListingInquries_FE_test.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "#trainRental.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#trainRental.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#testRental.head()#观察之后发现trainRental和testRental差异在于　一维　响应值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#testRental.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#sns.countplot(trainRental.interest_level)#查看响应值分布，两两之间都相差不到10倍，还可以"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#划分输入特征和响应\n",
    "X_train = trainRental.drop(\"interest_level\",axis = 1)\n",
    "y_train = trainRental[\"interest_level\"]\n",
    "#y_train.head()\n",
    "cols = X_train.columns\n",
    "#print(cols)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "#已经是特征编码后的数据\n",
    "#StratifiedKFold 分层采样交叉切分，确保训练集，测试集中各类别样本的比例与原始数据集中相同。\n",
    "RentalKFold = StratifiedKFold(n_splits = 4,shuffle = True,random_state = 3)\n",
    "#待观察模型是过拟合还是欠拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'subsample': [0.3, 0.4, 0.5, 0.6, 0.7, 0.8], 'colsample_bytree': [0.6, 0.7, 0.8, 0.9]}\n"
     ]
    }
   ],
   "source": [
    "subsample = [i/10.0 for i in range(3,9)]\n",
    "colsample_bytree = [i/10.0 for i in range(6,10)]\n",
    "param_test4 = dict(subsample=subsample, colsample_bytree=colsample_bytree)\n",
    "print(param_test4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#构造函数，下面用\n",
    "def modelfit(alg,X_train,y_train,useTrainCV=True,cv_folds = None,early_stopping_rounds = 100):\n",
    "    if useTrainCV:\n",
    "            xgb_param = alg.get_xgb_params()#将设置的参数拿出来\n",
    "            xgb_param[\"num_class\"] = 3 #是3分类问题，设置这个要在CV函数中用到\n",
    "\n",
    "            xgbTrain = xgb.DMatrix(X_train,label = y_train)#因为要直接调用xgboost，所以要变成DMtrix形式的\n",
    "            #直接调用xgboost内嵌CV,对迭代次数或者说是树的数目快速交叉验证\n",
    "            cvResult = xgb.cv(xgb_param,xgbTrain,num_boost_round = alg.get_params()[\"n_estimators\"],folds = cv_folds,\n",
    "                             metrics = \"mlogloss\",early_stopping_rounds = early_stopping_rounds)\n",
    "            n_estimators = cvResult.shape[0]#最佳参数迭代次数\n",
    "            print(n_estimators)\n",
    "            alg.set_params(n_estimators = n_estimators)#将找到的弱学习器数目设置进去\n",
    "            print(cvResult)\n",
    "            cvResult.to_csv(\"First_RentalNestimators_again.csv\",index_label = \"n_estimators\")\n",
    "\n",
    "    alg.fit(X_train,y_train,eval_metric = \"mlogloss\")#是多类分问题，是3类，三步曲第二步自定义函数内部三步曲第二步\n",
    "    trainPredprob = alg.predict_proba(X_train)\n",
    "    logloss = log_loss(y_train, trainPredprob)\n",
    "\n",
    "        \n",
    "    #Print model report:\n",
    "    print (\"logloss of train :\" )\n",
    "    print (logloss)        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "xgb4 = XGBClassifier(                               #三步曲第一步\n",
    "                            learning_rate = 0.1,\n",
    "                            n_estimators = 383,    #首次变更项\n",
    "                            max_depth =5 ,   \n",
    "                            min_child_weight =5 ,   #同一考虑\n",
    "                            gamma = 0,\n",
    "                            subsample = 0.3, \n",
    "                            colsample_bytree = 0.8,\n",
    "                            colsample_bylevel = 0.7,#行列采样\n",
    "                            objective = \"multi:softprob\",                                       #因为是多类分问题\n",
    "                            seed = 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "383\n",
      "     test-mlogloss-mean  test-mlogloss-std  train-mlogloss-mean  \\\n",
      "0              1.040025           0.000276             1.039362   \n",
      "1              0.990441           0.000196             0.989311   \n",
      "2              0.948012           0.000567             0.946499   \n",
      "3              0.911930           0.000494             0.910001   \n",
      "4              0.881065           0.000958             0.878593   \n",
      "5              0.853737           0.000896             0.850821   \n",
      "6              0.829966           0.001086             0.826554   \n",
      "7              0.808920           0.001010             0.804944   \n",
      "8              0.790531           0.000752             0.786032   \n",
      "9              0.774244           0.000838             0.769296   \n",
      "10             0.759689           0.000842             0.754222   \n",
      "11             0.746739           0.000930             0.740740   \n",
      "12             0.735270           0.000836             0.728931   \n",
      "13             0.724940           0.000914             0.718176   \n",
      "14             0.715855           0.000904             0.708582   \n",
      "15             0.707674           0.001055             0.700041   \n",
      "16             0.700598           0.001179             0.692360   \n",
      "17             0.694095           0.001252             0.685364   \n",
      "18             0.688175           0.001448             0.678887   \n",
      "19             0.682799           0.001539             0.672962   \n",
      "20             0.677992           0.001534             0.667758   \n",
      "21             0.673753           0.001608             0.663183   \n",
      "22             0.669794           0.001493             0.658800   \n",
      "23             0.666325           0.001477             0.654951   \n",
      "24             0.662677           0.001524             0.650922   \n",
      "25             0.659590           0.001575             0.647442   \n",
      "26             0.656714           0.001732             0.643956   \n",
      "27             0.654258           0.001875             0.640961   \n",
      "28             0.651795           0.001928             0.638069   \n",
      "29             0.649420           0.002098             0.635271   \n",
      "..                  ...                ...                  ...   \n",
      "353            0.590556           0.002414             0.476308   \n",
      "354            0.590643           0.002373             0.476065   \n",
      "355            0.590659           0.002330             0.475824   \n",
      "356            0.590685           0.002264             0.475599   \n",
      "357            0.590684           0.002261             0.475365   \n",
      "358            0.590694           0.002343             0.475078   \n",
      "359            0.590601           0.002287             0.474876   \n",
      "360            0.590635           0.002304             0.474648   \n",
      "361            0.590571           0.002296             0.474359   \n",
      "362            0.590556           0.002289             0.474077   \n",
      "363            0.590573           0.002285             0.473873   \n",
      "364            0.590606           0.002266             0.473639   \n",
      "365            0.590587           0.002268             0.473390   \n",
      "366            0.590624           0.002269             0.473174   \n",
      "367            0.590716           0.002202             0.472938   \n",
      "368            0.590840           0.002110             0.472726   \n",
      "369            0.590867           0.002183             0.472464   \n",
      "370            0.590877           0.002120             0.472240   \n",
      "371            0.590870           0.002069             0.472005   \n",
      "372            0.590864           0.002042             0.471780   \n",
      "373            0.590846           0.002082             0.471528   \n",
      "374            0.590888           0.002095             0.471304   \n",
      "375            0.590805           0.002072             0.471038   \n",
      "376            0.590821           0.002026             0.470782   \n",
      "377            0.590842           0.002015             0.470530   \n",
      "378            0.590822           0.002000             0.470339   \n",
      "379            0.590815           0.001942             0.470064   \n",
      "380            0.590840           0.001959             0.469824   \n",
      "381            0.590767           0.001949             0.469579   \n",
      "382            0.590735           0.001967             0.469391   \n",
      "\n",
      "     train-mlogloss-std  \n",
      "0              0.000414  \n",
      "1              0.000397  \n",
      "2              0.000270  \n",
      "3              0.000161  \n",
      "4              0.000452  \n",
      "5              0.000452  \n",
      "6              0.000408  \n",
      "7              0.000155  \n",
      "8              0.000451  \n",
      "9              0.000444  \n",
      "10             0.000656  \n",
      "11             0.000771  \n",
      "12             0.000887  \n",
      "13             0.000837  \n",
      "14             0.000987  \n",
      "15             0.001102  \n",
      "16             0.001163  \n",
      "17             0.001414  \n",
      "18             0.001330  \n",
      "19             0.001208  \n",
      "20             0.001233  \n",
      "21             0.001211  \n",
      "22             0.001362  \n",
      "23             0.001521  \n",
      "24             0.001583  \n",
      "25             0.001619  \n",
      "26             0.001337  \n",
      "27             0.001310  \n",
      "28             0.001245  \n",
      "29             0.001269  \n",
      "..                  ...  \n",
      "353            0.000196  \n",
      "354            0.000204  \n",
      "355            0.000326  \n",
      "356            0.000301  \n",
      "357            0.000321  \n",
      "358            0.000315  \n",
      "359            0.000354  \n",
      "360            0.000333  \n",
      "361            0.000336  \n",
      "362            0.000351  \n",
      "363            0.000378  \n",
      "364            0.000398  \n",
      "365            0.000384  \n",
      "366            0.000380  \n",
      "367            0.000400  \n",
      "368            0.000410  \n",
      "369            0.000382  \n",
      "370            0.000338  \n",
      "371            0.000359  \n",
      "372            0.000340  \n",
      "373            0.000307  \n",
      "374            0.000290  \n",
      "375            0.000278  \n",
      "376            0.000273  \n",
      "377            0.000246  \n",
      "378            0.000285  \n",
      "379            0.000252  \n",
      "380            0.000202  \n",
      "381            0.000232  \n",
      "382            0.000237  \n",
      "\n",
      "[383 rows x 4 columns]\n",
      "logloss of train :\n",
      "0.49503294449864843\n"
     ]
    }
   ],
   "source": [
    "modelfit(xgb4,X_train,y_train,cv_folds = RentalKFold) #三步曲第二步"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\ipykernel_launcher.py:1: FutureWarning: from_csv is deprecated. Please use read_csv(...) instead. Note that some of the default arguments are different, so please refer to the documentation for from_csv when changing your function calls\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "range(0, 383)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x21d68f1cf60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvResult = pd.DataFrame.from_csv(\"First_RentalNestimators_again.csv\")\n",
    "#画图\n",
    "train_means = cvResult[\"test-mlogloss-mean\"]\n",
    "train_stds = cvResult[\"test-mlogloss-std\"]\n",
    "\n",
    "test_means  = cvResult[\"test-mlogloss-mean\"]\n",
    "test_stds   = cvResult[\"test-mlogloss-std\"]\n",
    "\n",
    "x_axis      = range(0,cvResult.shape[0])\n",
    "print(x_axis)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,elinewidth = 0.1,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,elinewidth = 0.1,label='Train')\n",
    "pyplot.title(\"Data mining killer: XGBoost* The number of iterations:n_estimators vs Log Loss4\")\n",
    "pyplot.xlabel( 'n_estimators4' )\n",
    "pyplot.ylabel( 'Log Loss4' )\n",
    "pyplot.savefig( 'n_estimators4.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Dell\\Documents\\anaconda\\lib\\site-packages\\ipykernel_launcher.py:3: FutureWarning: from_csv is deprecated. Please use read_csv(...) instead. Note that some of the default arguments are different, so please refer to the documentation for from_csv when changing your function calls\n",
      "  This is separate from the ipykernel package so we can avoid doing imports until\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x21d68f1cfd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#help(pyplot.errorbar)\n",
    "    \n",
    "cvResult = pd.DataFrame.from_csv('First_RentalNestimators_again.csv')\n",
    "\n",
    "cvResult = cvResult.iloc[50:]#接下来再细看一下，线的厚度就是两倍标准差\n",
    "# plot\n",
    "test_means = cvResult['test-mlogloss-mean']\n",
    "test_stds = cvResult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvResult['train-mlogloss-mean']\n",
    "train_stds = cvResult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(50,cvResult.shape[0]+50)\n",
    "        \n",
    "fig = pyplot.figure(figsize=(10, 10), dpi=50)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"Data mining killer: XGBoost* The number of iterations:n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators4' )\n",
    "pyplot.ylabel( 'Log Loss4' )\n",
    "pyplot.savefig( 'n_estimators_detail4.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
